package File;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Ap0stoL2
 * Date: 2023-08-06
 * Time: 22:37
 */
//进行普通文件的复制
// 就是ctrl +c  和ctrl+v
//打开A,依次读出内容,再写出到B
//用字节流读入读出可以读取任何数据
import java.io.*;
import java.util.Scanner;

// 完成文件复制.
//输入: d:/tmp/skin.png
//     d:/skin2.png
public class Demo11 {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        // 1. 输入路径并且合法性判定
        System.out.println("请输入要复制的源文件路径(包括文件名字): ");
        String src = scanner.next();
        File srcFile = new File(src);
        if (!srcFile.isFile()) {
            System.out.println("您输入的源文件路径非法!");
            return;
        }
        System.out.println("请输入要复制到的目标路径(包括文件更改后名字): ");
        String dest = scanner.next();
        File destFile = new File(dest);
        // 不要求目标文件本身存在. 但是得保证目标文件所在的目录, 得是存在的.
        // 假设目标文件写作 d:/tmp/cat2.jpg, 就需要保证 d:/tmp 目录是存在的.
        if (!destFile.getParentFile().isDirectory()) {
            System.out.println("您输入的目标文件路径非法!");
            return;
        }

        // 2. 进行复制操作的过程. 按照字节流打开.(应为不知道打开的是文本文件还是二进制文件,任何文件都能以二进制打开,都能以字节的方式操作)
        try (InputStream inputStream = new FileInputStream(srcFile);
             OutputStream outputStream = new FileOutputStream(destFile)) {
            while (true) {
                byte[] buffer = new byte[20480];
                //每次read 是访问硬盘,开销不小的,因此把buffer开大点,可以减少访问次数,但是前提要是内存空间足够
                int n = inputStream.read(buffer);//返回值为读了多少个字节
                System.out.println("n = " + n);
                if (n == -1) {
                    System.out.println("读取到 eof, 循环结束. ");
                    break;
                }
                //我们所说的打开就会清空指的是FileOutputStream这个打开就会把内容清空,他会默认是个新文件,但是反复往打开的新文件写入东西是不会清空的
                outputStream.write(buffer, 0, n);
            }
        }
    }
}